package cl.vixionarios.biotika.dao.implementations.postgresql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.jboss.logging.Logger;

import cl.vixionarios.biotika.dao.DBBase;
import cl.vixionarios.biotika.dao.interfaces.IUrgencia;
import cl.vixionarios.biotika.dao.to.UrgenciaTO;

public class UrgenciaDB extends DBBase implements IUrgencia{
	
	public UrgenciaDB(Connection c){
		
		conn = c;
	}
	private Logger logger = Logger.getLogger(getClass().getCanonicalName());
	
	public List<UrgenciaTO> obtenerUrgenciasCercanas(String latitudActual,
			String longitudActual) {
		
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		Double latitudDouble = Double.parseDouble(latitudActual);
		Double longitudDouble = Double.parseDouble(longitudActual);
		
		String query = 	" SELECT region, id_servicio, nombre_servicio, id_comuna, nombre_comuna," +
				       	" id_departamento, nombre_departamento, id_tipo, nombre_tipo, codigo_establecimiento," + 
				       	" nombre_establecimiento, direccion_establecimiento, telefono_establecimiento," + 
				       	" fax_establecimiento, latitud, longitud FROM (" +
					    "   select (1.852 * 60 * degrees(ACOS ( SIN( radians(?) ) * SIN( radians(latitud::numeric) ) + COS( radians(?) ) * COS( radians(latitud::numeric) ) * COS( radians(longitud::numeric - ?) )))) as distancia" +
					    " ,	region, id_servicio, nombre_servicio, id_comuna, nombre_comuna," +
					    "   id_departamento, nombre_departamento, id_tipo, nombre_tipo, codigo_establecimiento," + 
					    "   nombre_establecimiento, direccion_establecimiento, telefono_establecimiento," + 
					    "   fax_establecimiento, latitud, longitud" +
						" from servicio_urgencia" + 
						" ) T" +
						" WHERE T.distancia < 10";
		
		List<UrgenciaTO> urgenciasCercanas = new ArrayList<UrgenciaTO>();
		
		try{
			
			pstmt = conn.prepareStatement(query);
			pstmt.setDouble(1, latitudDouble);
			pstmt.setDouble(2, latitudDouble);
			pstmt.setDouble(3, longitudDouble);
			
			rs = pstmt.executeQuery();
			
			while(rs.next()){
				
				UrgenciaTO urgencia = new UrgenciaTO();
				
				urgencia.setRegion(rs.getInt("region"));
				urgencia.setIdServicio(rs.getInt("id_servicio"));
				urgencia.setNombreServicio(rs.getString("nombre_servicio"));
				urgencia.setIdComuna(rs.getInt("id_comuna"));
				urgencia.setNombreComuna(rs.getString("nombre_comuna"));
				urgencia.setIdDepartamento(rs.getInt("id_departamento"));
				urgencia.setNombreDepartamento(rs.getString("nombre_departamento"));
				urgencia.setIdTipo(rs.getString("id_tipo"));
				urgencia.setNombreTipo(rs.getString("nombre_tipo"));
				urgencia.setCodigoEstablecimiento(rs.getString("codigo_establecimiento"));
				urgencia.setNombreEstablecimiento(rs.getString("nombre_establecimiento"));
				urgencia.setDireccionEstablecimiento(rs.getString("direccion_establecimiento"));
				urgencia.setTelefonoEstablecimiento(rs.getString("telefono_establecimiento"));
				urgencia.setFaxEstablecimiento(rs.getString("fax_establecimiento"));
				urgencia.setLatitud(rs.getString("latitud"));
				urgencia.setLongitud(rs.getString("longitud"));
				
				urgenciasCercanas.add(urgencia);
			}
		}
		catch(SQLException ex)
		{
			logger.error(ex);
		}
		catch (Exception ex) 
		{
			logger.error(ex);
		}
		finally{
			if(pstmt!=null){
				try{
					pstmt.close();
					rs.close();
				}
				catch(SQLException ex){
					logger.error("[" + this.getClass().getCanonicalName() + "] [obtenerUrgenciasCercanas][" + ex.getMessage() + "]");
				}
			}
		}
		return urgenciasCercanas;
	}

}
